#!/usr/bin/env bash
###################################################################
# Function :CentOS7.X nginx 服务编译安装                           #
# Platform :RedHatEL7.x Based Platform                            #
# Version  :1.1                                                   #
# Date     :2021-04-03                                            #
# Author   :mugoLH                                                #
# Contact  :houxiaoshuai@baidu.com & hxsaj@126.com                #
# Company  :                                                      #
# depend on:                                                      #
###################################################################
set -e
#  变量列表 List of common variables
########## ########## ########## ########## ########## ########## #
# 1.1 定义变量
# nginx 部署路径
NginxDir="/usr/local/nginx"
# 安装日志
Install_Log="nginx_install.log"
# nginx 的启动用户
NGuser=www
# nginx 的启动用户组
NGgroup=www
# 初始支持软件
SoftBase=(vim lrzsz wget)
# nginx 编译安装依赖软件
SoftMake=(pcre-devel pcre gcc gcc-c++ openssl openssl-devel zlib-devel net-tools)
# 部署软件源
Yum_Repo="https://mirrors.aliyun.com/repo/Centos-7.repo"
# 部署软件源文件名
Yum_Repo_Name="CentOS-ali.repo"
# 部署软件源失败提示
Yum_Failed_Notice="获取阿里源失败 ！！！"
# 部署epel软件源
Epel_Repo="http://mirrors.aliyun.com/repo/epel-7.repo"
# 部署epel软件源
Epel_Repo_Name="epel.repo"
# 部署epel软件源失败提示
Epel_Failed_Notice="获取epel源失败 ！！！"

 
# 1.2 定义编译模块
ConfigureMoudule="\
--prefix=${NginxDir} \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_mp4_module \
--with-http_realip_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-stream \
--with-pcre"

#  公共函数列表 List of common functions
########## ########## ########## ########## ########## ########## #
# [ ---- ---- 色彩函数定义
#    指示 # echo -e "\n\033[1m 色彩测试-提示 \033[0m\n" 
function show_tips () { echo -e "\033[1m $@ \033[0m" >&1 ; }
#    提示 # echo -e "\n\033[1;38;46m 色彩测试-提示 \033[0m\n"
function show_notice () { echo -e "\033[1;38;46m $@ \033[0m" >&1 ; }
#    警告 # echo -e "\n\033[1;35;46m 色彩测试-警告 \033[0m\n"
function show_warning () { echo -e "\033[1;35;46m $@ \033[0m" >&2 ; }
#    报错 # echo -e "\n\033[1;31;46m 色彩测试-错误 \033[0m\n"
function show_error () { echo -e "\033[1;31;46m $@ \033[0m" >&2 ; }

#  应用函数列表 Application function list
########## ########## ########## ########## ########## ########## #
#  列出防火墙开放的端口
function Firewalld_Open_port()
{
	# 检查是否目标端口已开
	if ! $(firewall-cmd --zone=public --list-ports|grep -qw ${1});then
		firewall-cmd --zone=public --add-port=${1}/tcp  --permanent
		firewall-cmd --reload
	fi
	# 展示所有已开端口
	#firewall-cmd --zone=public --list-ports
}

#  安装yum源函数
function Get_Repo() 
{
	curl -so /etc/yum.repos.d/${1} ${2} >/dev/null 2>&1 || show_error " ${3} "
	yum clean all >/dev/null 2>&1 &&yum makecache >/dev/null 2>&1 
}
#  关闭SELinux
function Selinux_Off()
{
	sed -i "s/"SELINUX=enforcing"/"SELINUX=disabled"/g" /etc/selinux/config
	[[ $(getenforce)=="enforcing" ]] && setenforce 0 >/dev/null 2>&1
}
#  安装软件
function Yum_Install()
{
	yum install -y $@ >/dev/null 2>&1 || show_error "  软件安装失败 ！！！  "
}




#  获取nginx版本列表函数
function Nginx_Version_List() 
{
	curl -s http://nginx.org/en/download.html|grep -e "tar.gz\""| \
	awk 'BEGIN{i=1}{gsub("href","\n",$0);i++;print}'|grep tar.gz| \
	grep -v asc|awk -F ">|<" '{print$2}'
}
function Nginx_Download()
{
	# 如果函数带有指定安装的版本就静默安装
	if [ $#  = 0 ] ;then
		# 展示 nginx 版本列表
		Nginx_Version_List
		# 选择版本
		read -p " 请复制您需要编译安装的版本选择安装（复制其中一个不要有空格，例：nginx-1.18.0）：" NginxVersion
		# 下载源码包
		wget http://nginx.org/download/${NginxVersion}.tar.gz  >/dev/null 2>&1 || show_error "  下载 nginx 源码失败 ！！！  "
	elif [ $#  = 1 ] ; then
		# 下载指定的版本
		NginxVersion="${1}"
		wget http://nginx.org/download/${NginxVersion}.tar.gz  >/dev/null 2>&1 || show_error "  下载 nginx 源码失败 ！！！  "

	fi
}
function Nginx_Compile()
{
	# 解压压缩包
	tar -xf ${1}.tar.gz   && cd ${1} 
	# 编译安装
	./configure ${ConfigureMoudule} >./${Install_Log} 2>&1  || show_error "  预编译失败 ！！！  "
	make -j $(cat /proc/cpuinfo| grep "processor"| wc -l) >./${Install_Log} 2>&1 &&make install >./${Install_Log} 2>&1 || show_error "  make编译失败 ！！！  "
}
function Nginx_Start()
{
	# 默认配置启动 Nginx 服务
	${NginxDir}/sbin/nginx || show_error "  nginx启动失败 ！！！  "
}
function Nginx_Stop()
{
	# 关闭 Nginx 服务
	kill -INT $(ps -ef |grep nginx|grep master|awk '{print$2}')
}
#  编译安装 nginx 
function Nginx_Install_Compile()
{
	#  1，编译安装nginx
	show_notice " ------ 编译安装nginx ------" 
	#  1.1，安装依赖的基础软件
	show_tips " 1，安装基础软件 "      &&Yum_Install ${SoftBase[@]}
	#  1.2，安装阿里yum源
	show_tips " 2，安装阿里yum源 "     &&Get_Repo ${Yum_Repo_Name} ${Yum_Repo} ${Yum_Failed_Notice}
	#  1.3，安装epel源
	show_tips " 3，安装epel源 "       &&Get_Repo ${Epel_Repo_Name} ${Epel_Repo} ${Epel_Failed_Notice}
	#  1.4，安装编译支持
	show_tips " 4，安装编译依赖 "      &&Yum_Install ${SoftMake[@]}
	#  2.1，下载 nginx 版本
	if [ $#  = 0 ] ;then
		show_tips " 5，下载nginx...... "  &&Nginx_Download
	elif [ $#  = 1 ];then
		show_tips " 5，下载nginx...... "  &&Nginx_Download ${1}
	fi
	#  2.2 编译安装nginx
	show_tips " 6，编译安装  "        &&Nginx_Compile ${NginxVersion}
	#  2.3 关闭SeLinux
	show_tips " 7，关闭Selinux  "     &&Selinux_Off
	# 2.4 防火墙开放端口
	show_tips " 8，防火墙放行80和443 " &&Firewalld_Open_port 80 && Firewalld_Open_port 443
	# 2.6 运行nginx 并查看状态
	show_tips " 9，启动nginx...... "  &&Nginx_Start
	echo ""
	# 2.7 检测安装完成的版本的和运行状态
	Installed_Nginx_Version=$(${NginxDir}/sbin/nginx -v  2>&1 |awk -F "/" '{print$2}')
	show_notice " 程序 NGINX 部署位置：${NginxDir}"
	show_notice " 程序 NGINX 已安装版本：${Installed_Nginx_Version}"
	show_notice " 程序 NGINX 运行状态："    &&ps -ef |grep nginx |grep -v process
	show_notice " 程序 NGINX 监听状态："    &&netstat -atnlp|grep nginx
}

##############################################################################################
if [ $#  = 0 ] ;then
	show_tips "English eg：sh $0 [ start|stop|install|install {Nginx_version}|uninstall ]"
	show_tips "English eg：sh $0 start "
	show_tips "English eg：sh $0 install nginx-1.18.0 "
	show_tips "中文 应用选项：sh $0 [ start|stop|install|install {Nginx_version}|uninstall ]"
	show_tips "中文 举例（启动nginx）：sh $0 start "
	show_tips "中文 举例（交互安装nginx版本）：sh $0 install "
	show_tips "中文 举例（安装指定版本nginx）：sh $0 install nginx-1.18.0 "
elif [ $#  = 1 ] ;then
	# 只有一个位置参数，就判断是关闭、启动、、安装还是卸载
	case ${1} in
		"start"     ) Nginx_Start             ;;
		"stop"      ) Nginx_Stop              ;;
		"install"   ) Nginx_Install_Compile   ;;
        "uninstall" ) rm -rf ${NginxDir}      ;;
    esac
elif [ $# = 2 ] ;then
	# 安装脚本指定版本
	Nginx_V=${2}
	Nginx_Install_Compile ${Nginx_V}
fi







